#include <iostream>
#include <unistd.h>
#include <signal.h>
#include <cassert>
using namespace std;

static void showPending(sigset_t& pending)
{
    for(int sig = 0; sig <= 31; sig++)
    {
        if(sigismember(&pending,sig))
            cout << "1";
        else
            cout << "0";
    }
    cout <<  endl;
}
static void handler(int signum)
{
    cout << "捕捉到了信号 :" << signum << endl;
}
int main()
{

    //0.方便测试 捕捉2号信号，不要退出
    signal(2,handler);
    //1.创建信号集
    sigset_t bset,boset;//b代表block,o=old
    sigset_t pending;
    //2.初始化
    sigemptyset(&bset);
    sigemptyset(&boset);
    sigemptyset(&pending);
    //3.添加要进行屏蔽的信号
    sigaddset(&bset,2/*SIGINT*/);
    //4.设置set到内核中对应的进程内部【默认情况下进程不会对信号进行block】
    sigprocmask(SIG_BLOCK,&bset,&boset);
    cout << "block 2号信号成功 " << getpid() << endl;
    //5. 重复打印当前进程信号集
    int count = 0;
    while(true)
    {
        // 5.1 获取pending信号集
        sigpending(&pending);
        // 5.2 打印pending 信号集
        showPending(pending);
        sleep(1);
        count++;
        if(count == 20)
        {
            cout << "解除对与2号信号的block" << endl;
            sigprocmask(SIG_SETMASK,&boset,nullptr);
        }
    }
    return 0;
}